package 定时任务;

import java.time.Duration;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

/**
 * @Author zhangxuhui
 * @Date 2024/1/11
 * @email zxh_1633@163.com
 * schedule：开始调度任务，提供了几个包装方法；
 * cancle：终止任务调度，取消当前调度的所有任务，正在运行的任务不受影响；
 * purge：从任务队列中移除所有已取消的任务；
 * Timer 也会有一些缺陷：
 * Timer 是单线程的，假如有任务 A,B,C，任务 A 如果执行时间比较长，那么就会影响任务 B,C 的启动和执行时间，如果 B,C 执行时间也比较长，那就会相互影响；
 * Timer 不会捕获异常，如果 A,B,C 任何一个任务在执行过程中发生异常，就会导致 TImer 整个定时任务停止工作；
 * Timer 是基于绝对时间调度的，而不是基于相对时间，所以它对系统时间的改变非常敏感；
 */
class MyTask extends TimerTask {
    @Override
    public void run() {
        System.out.println("定时任务执行！"+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("YYYY-mm-dd HH:ss:mm.SSS")));
    }
}

public class TimerTaskTest {
    public static void main(String[] args) throws InterruptedException {
        Timer timer = new Timer();
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("YYYY-mm-dd HH:ss:mm.SSS");
        /**
         * 第一个参数：任务
         * 第二个参数：任务执行延时
         * 第三个参数：任务执行间隔
         */
        System.out.println("开始："+ LocalDateTime.now().format(dateTimeFormatter));
        //timer.schedule(new MyTask(), 1000, 1000);
        //指定执行时间,并且执行一次。
        timer.schedule(new MyTask(),new Date(System.currentTimeMillis()+5000));
        Thread.sleep(6000);
        timer.cancel();
        timer.purge();
    }
}
